﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data.OleDb; //подключение OleDb
using Domain; //подключение проекта Domain
using System.Data; //подключение System.Data, нужна ниже в коде
using Setting;

namespace Session
{
    public class BrokerDlv
    {
        OleDbConnection connection; // объявление OleDbConnection
        OleDbCommand command; // объявление OleDbCommand
        string x, f, l; // объявление переменных для функции "поиск по id"
        Props prop = new Props();
        string dbpath;

        private void readSetting()
        {
            prop.ReadXml();
            dbpath = Convert.ToString(prop.Fields.dbpath);

        }

        private void ConnectTo() // функция подключения БД
        {
            readSetting();
            connection = new OleDbConnection(@" Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + dbpath + "; Persist Security Info = False;"); // объявление техналогии и пути
            command = connection.CreateCommand(); // Создает и возвращает объект OleDbCommand, связанный с объектом OleDbConnection.

        }


        public BrokerDlv() // функция для класса BrokerDlv
        {
            ConnectTo(); // вызов функции подключения
        }

        public void Insert (Dm_Delivery dlv, Dm_Pers prs) // функция добавления новой записи
        {
            try
            {

                command.CommandText = "INSERT INTO T_Delivery ([Id_pers_sale], [Date], [dis_time_ready], [customer], [address], [contact], [note], [movers], [date_crt], [id_stat]) VALUES('" + prs.Id_pers + "', '" + dlv.Date + "', '" + dlv.Dis_time_ready + "', '" + dlv.Customer + "', '" + dlv.Address + "', '" + dlv.Contact + "', '" + dlv.Note + "', '" + dlv.Movers + "', '" + dlv.Date_crt + "', '" + dlv.Id_stat + "')"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.
            }

            catch (Exception ) 
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public List<Dm_Pers> FillComboBoxPers() // функция для заполнения ComboBox из Dm_Pers
        {
            List<Dm_Pers> prsList = new List<Dm_Pers>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT * FROM t_pers Where id_dep = 1"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Pers prs = new Dm_Pers(); // объявление Dm_Pers


                    prs.Id_pers = Convert.ToInt32(reader["Id_pers"].ToString()); // чтение Id_pers из БД и занисение информации в prs.Id_pers
                    prs.F_name = reader["F_name"].ToString(); // чтение F_name из БД и занисение информации в  prs.F_name
                    prs.L_name = reader["L_name"].ToString(); // чтение L_name из БД и занисение информации в  prs.L_name


                    prsList.Add(prs); // добавление данных в List< >
                }

                return prsList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }
        
        public List<Dm_Delivery> FillGrid() // функция для заполнения Grid
        {
            List<Dm_Delivery> dlvList = new List<Dm_Delivery>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT T_Delivery.date_crt, T_Delivery.id_dlv, T_Delivery.id_pers_sale, T_Delivery.date, T_Delivery.dis_time_ready, T_Delivery.customer, T_Delivery.address, T_Delivery.contact, T_Delivery.note, T_Delivery.movers, T_Pers.id_pers, T_Pers.F_name, T_Pers.L_name FROM T_Pers INNER JOIN T_Delivery ON T_Pers.[id_pers] = T_Delivery.[id_pers_sale]"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Delivery dlv = new Dm_Delivery(); // объявление Dm_Delivery


                    dlv.Id_dlv = Convert.ToInt32(reader["Id_dlv"].ToString()); // чтение Id_dlv из БД и занисение информации в dlv.Id_dlv
                    dlv.Id_pers_sale = Convert.ToInt32(reader["Id_pers_sale"].ToString()); // чтение Id_pers_sale из БД и занисение информации в dlv.Id_pers_sale
                    dlv.MengF = reader["F_name"].ToString();
                    dlv.MengL = reader["L_name"].ToString();
                    dlv.Date = Convert.ToDateTime(reader["Date"].ToString()); // чтение Date из БД и занисение информации в dlv.Date
                    dlv.Dis_time_ready = reader["Dis_time_ready"].ToString(); // чтение Dis_time_ready из БД и занисение информации в dlv.Dis_time_ready
                    dlv.Customer = reader["Customer"].ToString(); // чтение Customer из БД и занисение информации в dlv.Customer
                    dlv.Address = reader["Address"].ToString(); // чтение Address из БД и занисение информации в dlv.Address
                    dlv.Contact = reader["Contact"].ToString(); // чтение Contact из БД и занисение информации в dlv.Contact
                    dlv.Note = reader["Note"].ToString(); // чтение Note из БД и занисение информации в dlv.Note
                    dlv.Movers = reader["Movers"].ToString(); // чтение Movers из БД и занисение информации в dlv.Movers
                    dlv.Date_crt = reader["date_crt"].ToString();

                    dlvList.Add(dlv); // добавление данных в List< >
                }

                return dlvList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public void Update(Dm_Delivery OldDlv, Dm_Delivery NewDlv, Dm_Pers prs) // функция обновления записи по id
        {
            try
            {
                command.CommandText = "UPDATE T_Delivery SET [Id_pers_sale]='" + prs.Id_pers + "' , [Date]='" + NewDlv.Date + "' , [dis_time_ready] ='" + NewDlv.Dis_time_ready + "' , [customer] ='" + NewDlv.Customer + "' , [address] ='" + NewDlv.Address + "' , [contact] ='" + NewDlv.Contact + "' , [note] ='" + NewDlv.Note + "' , [movers] ='" + NewDlv.Movers + "' , [id_stat] ='" + NewDlv.Id_stat + "' WHERE [id_dlv]=" + OldDlv.Id_dlv; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public void Delete(Dm_Delivery dlv) // функция удаления записи по id
        {
            try
            {
                command.CommandText = "DELETE FROM T_Delivery WHERE Id_dlv=" + dlv.Id_dlv; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public string idxPers(int mg) // функция "поиск по id"
        {
            try
            {
                command.CommandText = "SELECT [id_pers], [F_name], [L_name] FROM [T_pers] WHERE [id_pers] =" + mg ; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    f = reader["F_name"].ToString(); // чтение F_name из БД и занисение информации в f
                    l = reader["L_name"].ToString(); // чтение L_name из БД и занисение информации в l               
                }

                return x = f + " " + l; // возврат значений f и l
                
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

    }
}
